﻿using BookStore.Solution.Configurations;
using BookStore.Solution.Entities;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BookStore.Solution.BLL
{
    public class AccountManager
    {
        public static Account CurrentAccount;
        /*
         * Insert account to database
         */
        public string Insert(Account entity)
        {
            Account account = null;
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                try
                {
                    account = ctx.Accounts.Where(a => a.EmployeeID == entity.EmployeeID).FirstOrDefault<Account>();
                    if (account == null)
                    {
                        account = ctx.Accounts.Where(a => a.UserName == entity.UserName).FirstOrDefault<Account>();
                        if (account == null)
                        {
                            Role[] array = new Role[entity.Roles.Count];
                            entity.Roles.CopyTo(array, 0);
                            entity.Roles.Clear();
                            foreach (Role role in array)
                                entity.Roles.Add(ctx.Roles.Where(r => r.RoleID == role.RoleID).FirstOrDefault<Role>());
                            ctx.Accounts.Add(entity);
                            if (ctx.SaveChanges() > 0)
                            {
                                SystemLogManager.Insert("Thêm tài khoản: " + entity);
                                return "Thêm thành công";
                            }
                            return "Thêm thất bại";
                        }
                        else
                            return "Trùng khóa chính";
                    }
                    else
                        return "Mã nhân viên đã có tài khoản";
                }
                catch (Exception e)
                {
                    return e.Message;
                }
            }
        }

        /**
         * Reset password
         */
        public string ResetPassword(Account t)
        {
            Account account = null;
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                account = ctx.Accounts.Where(a => a.UserName == t.UserName).FirstOrDefault<Account>();
                if (account != null)
                {
                    account.Password = t.Password;
                    ctx.Entry(account).State = System.Data.Entity.EntityState.Modified;
                    if (ctx.SaveChanges() > 0)
                    {
                        t = account;
                        SystemLogManager.Insert("Cập nhật mật khẩu tài khoản: " + account);
                        return "Cập nhật thành công";
                    }
                    else
                        return "Cập nhật thất bại";
                }
                else
                    return "Tên đăng nhập không tồn tại";
            }
        }

        /**
         * Update status
         */
        public string UpdateStatus(Account t)
        {
            Account account = null;
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                account = ctx.Accounts.Where(a => a.UserName == t.UserName).FirstOrDefault<Account>();
                if (account != null)
                {
                    account.Status = t.Status;
                    ctx.Entry(account).State = System.Data.Entity.EntityState.Modified;
                    if (ctx.SaveChanges() > 0)
                    {
                        t = account;
                        SystemLogManager.Insert("Cập nhật trạng thái tài khoản: " + account);
                        return "Cập nhật thành công";
                    }
                    else
                        return "Cập nhật thất bại";
                }
                else
                    return "Tên đăng nhập không tồn tại";
            }
        }

        /**
         * Update roles
         */
        public string UpdateRoles(Account entity)
        {
            Account account = null;
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                account = ctx.Accounts.Where(a => a.UserName == entity.UserName).FirstOrDefault<Account>();
                if (account != null)
                {
                    account.Roles.Clear();
                    Role[] array = new Role[entity.Roles.Count];
                    entity.Roles.CopyTo(array, 0);
                    foreach (Role role in array)
                        account.Roles.Add(ctx.Roles.Where(r => r.RoleID == role.RoleID).FirstOrDefault<Role>());
                    ctx.Entry(account).State = System.Data.Entity.EntityState.Modified;
                    if (ctx.SaveChanges() > 0)
                    {
                        entity = account;
                        SystemLogManager.Insert("Cập nhật quyền tài khoản: " + account);
                        return "Cập nhật thành công";
                    }
                    else
                        return "Cập nhật thất bại";
                }
                else
                    return "Tên đăng nhập không tồn tại";
            }
        }

        /*
         * Delete Account 
         */
        public string Delete(Account t)
        {
            Account account = null;
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                account = ctx.Accounts.Where(a => a.UserName == t.UserName).FirstOrDefault<Account>();
                if (account != null)
                {
                    account.Roles.Clear();
                    ctx.Entry(account).State = System.Data.Entity.EntityState.Deleted;
                    if (ctx.SaveChanges() > 0)
                    {
                        SystemLogManager.Insert("Xóa tài khoản: " + account);
                        return "Xóa thành công";
                    }
                    else
                        return "Xóa thất bại";
                }
                else
                    return "Tên đăng nhập không tồn tại";
            }
        }

        /*
         * Tìm kiếm theo tên đăng nhập
         */
        public DataTable SearchbyUserName(string username)
        {
            List<Account> accounts = null;
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                accounts = ctx.Accounts.Where(a => a.UserName.Contains(username)).ToList<Account>();
            }
            return CreateTable(accounts);
        }

        private DataTable CreateTable(List<Account> list)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("UserName",Type.GetType("System.String"));
            dt.Columns.Add("Password", Type.GetType("System.String"));
            dt.Columns.Add("EmployeeID", Type.GetType("System.String"));
            dt.Columns.Add("Status", Type.GetType("System.String"));
            foreach (Account a in list)
            {
                DataRow newrow = dt.NewRow();
                object[] array = new object[4];
                array[0] = a.UserName;
                array[1] = a.Password;
                array[2] = a.EmployeeID;
                array[3] = a.Status;
                newrow.ItemArray = array;
                dt.Rows.Add(newrow);
            }
            return dt;
        }

        /*
         * Get datatable of account
         */
        public DataTable GetAll()
        {
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                List<Account> AccountList = (from a in ctx.Accounts 
                                             select a).ToList<Account>();
                DataTable dt = CreateTable(AccountList);
                return dt;
            }
        }

        public Account GetSingle(string username)
        {
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                ctx.Configuration.LazyLoadingEnabled = false;
                Account entity = (from a in ctx.Accounts
                                  where a.UserName == username
                                  select a).FirstOrDefault<Account>();
                ctx.Entry(entity).Collection(s => s.Roles).Load();
                return entity;
            }
        }


        public static List<string> GetRoleName()
        {
            if (CurrentAccount != null)
            {
                List<string> result = new List<string>();
                Role[] role = new Role[CurrentAccount.Roles.Count];
                CurrentAccount.Roles.CopyTo(role, 0);
                for (int i = 0; i < role.Length; i++)
                    result.Add(role[i].RoleName);
                return result;
            }

            return null;
        }
        public static string LogIn(Account account)
        {
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                ctx.Configuration.LazyLoadingEnabled = false;
                CurrentAccount = ctx.Accounts.Where(a => a.UserName == account.UserName).FirstOrDefault<Account>();
                if (CurrentAccount != null)
                {
                    if (CurrentAccount.Password == account.Password)
                    {
                        if (CurrentAccount.Status == "Khả dụng")
                        {
                            ctx.Entry(CurrentAccount).Reference( e=> e.Employee).Load();
                            ctx.Entry(CurrentAccount).Collection(s => s.Roles).Load();
                            CurrentAccount.Status = "Đang đăng nhập";
                            ctx.Entry(CurrentAccount).State = System.Data.Entity.EntityState.Modified;
                            if (ctx.SaveChanges() > 0)
                            {
                                SystemLogManager.Insert("Đăng nhập: " + CurrentAccount);
                                return "Đăng nhập thành công";
                            }
                            else
                                return "Đăng nhập thất bại";
                        }
                        else
                        {
                            if (CurrentAccount.Status == "Bị khóa")
                            {
                                CurrentAccount = null;
                                return "Tài khoản bị khóa";
                            }
                            else
                            {
                                CurrentAccount = null;
                                return "Tài khoản đang đăng nhập ở thiết bị khác";
                            }
                        }
                    }
                    else
                    {
                        CurrentAccount = null;
                    }
                }
                return "Tên đăng nhập hoặc mật khẩu không đúng";
            }
        }

        public static void LogOut()
        {
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                CurrentAccount = ctx.Accounts.Where(a => a.UserName == CurrentAccount.UserName).FirstOrDefault<Account>();
                if (CurrentAccount != null)
                {
                    CurrentAccount.Status = "Khả dụng";
                    ctx.Entry(CurrentAccount).State = System.Data.Entity.EntityState.Modified;
                    if (ctx.SaveChanges() > 0)
                    {
                        SystemLogManager.Insert("Đăng xuất: " + CurrentAccount);
                    }
                }
                CurrentAccount = null;
            }
        }
        public static bool ChangePassword(string OldPassword, string NewPassword)
        {
            using (BookStoreEntities ctx = new BookStoreEntities())
            {
                CurrentAccount = ctx.Accounts.Where(a => a.UserName == CurrentAccount.UserName).FirstOrDefault<Account>();
                if (CurrentAccount != null)
                {
                    if (CurrentAccount.Password == OldPassword)
                    {
                        CurrentAccount.Password = NewPassword;
                        ctx.Entry(CurrentAccount).State = System.Data.Entity.EntityState.Modified;
                        if (ctx.SaveChanges() > 0)
                        {
                            SystemLogManager.Insert("Đổi mật khẩu tài khoản: " + CurrentAccount);
                            return true;
                        }
                        return false;
                    }
                    return false;
                }
                else
                    return false;
            }
        }
    }
}
